package cn.bearspark.idgenerator.provider.service.bo;

import lombok.ToString;

import java.util.concurrent.atomic.AtomicLong;

/**
 * 有序的 id 生成器的业务对象
 *
 * @author f
 */
@ToString(callSuper = true)
public class SeqIdGeneratorBO extends IdGeneratorBO {

    /**
     * 当前 id 段的初始 id
     */
    private final long start;

    /**
     * 当前 id 段的结束 id
     */
    private final long end;

    /**
     * 在内存中记录的当前有序 id 的值
     * <p>
     * 可能有多个线程来递增它，所以需要使用原子类
     */
    private final AtomicLong currId;

    public SeqIdGeneratorBO(int code, long step, long start, long end) {
        super(code, step);
        this.start = start;
        this.end = end;
        this.currId = new AtomicLong(start);
    }

    @Override
    public Long generateId() {
        return currId.getAndIncrement();
    }

    @Override
    public boolean isExhausted(Long currId) {
        // 如果当前获取的 id 大于当前 id 段的结束 id，则说明当前 id 段被用尽
        return currId > this.end;
    }

    @Override
    public long fetchUsedNum() {
        // 已使用的 id 数 = 当前 id 的值 - 当前 id 段的初始值
        return currId.get() - start;
    }
}
